Boite à outils 1 :



La première étape de ce projet a pour objectif d’extraire les contenus des titres et descriptions des fils RSS du Monde. Ces derniers sont sous format XML, un langage de structuration des données ayant recours à des balises.

Comme tous les fichiers XML ne sont pas sur le même modèle, il nous faut la fonction chomp et une concaténation pour les mettre sur le même format (pour la version avec les expressions régulières, appelées aussi regex). Une fois les contenus textuels récupérés, nous filtrons les éventuels doublons à l’aide de tables de hashage (%dictionnairedesfils et %dictionnairedescription) et nous appliquons une procédure de nettoyage qui remplace les caractères spéciaux et les problèmes d’encodage comme les oe et les diacrités (ex : $chainetrouvee=~s /\x{0153}/oe/g; ). Le $titre ou le $description courant est envoyé à la procédure nettoyage puis enregistré dans une variable du même nom une fois « propre ».

$description=&nettoyage($description);
$titre=&nettoyage($titre);

Afin de traiter le dossier 2014 sur sa totalité, nous avons incrémenté nos programmes d’une procédure de parcours d’arborescence, qui reconstruit le chemin jusqu’à un premier fichier xml, extrait et nettoie ses contenus, puis remonte dans l’arborescence pour recommencer sur un autre. Les étapes détaillées de cette procédure sont les suivantes :
•    On crée une variable $path qui contiendra le premier élément de la liste @_, qui correspond, au début, au chemin du répertoire entré,
•    On ouvre ce répertoire entré en argument,
•    On crée une liste @files qui correspond à l’ensemble des éléments contenus dans le répertoire qui sont lus grâce à la fonction readdir,
•    On ferme ce répertoire,
•    Pour chaque élément de la liste @files, on passe directement au suivant s'il est égal à 1 ou plusieurs points (syntaxe UNIX),
•    Si ce n’est pas le cas, on reconstruit le chemin atteint jusqu’ici, soit le nom du répertoire entré / nom du premier élément utilisable en découlant. Le programme reconstitue ainsi le chemin par rapport à notre emplacement,
•    Chaque fois la question suivante est posée par le programme : ai-je affaire à un répertoire (-d) ou un fichier (-f) ? S’il s’agit d’un répertoire, je relance le parcours de l’arborescence depuis le chemin établit jusqu’ici, sinon j’ouvre et je traite le fichier puis je recommence pour un autre fichier et un autre dossier, etc..

A la suite de quoi, il faut faire un test pour s’assurer que le fichier n’est pas vide :

if ((-s $file !=0))

Nous avons donc conçu deux programmes différents pour cela, un à base d’expressions régulières et l’autre à l’aide du module perl XML::RSS. Ce module reconstruit à partir du fichier xml, un nouveau scalaire qui se présente sous la forme d’un tableau associatif [capture]. Les clés du tableau correspondent aux balises du fichier xml et les valeurs à leurs contenus. Nous pouvons alors récupérer tous les titres et descriptions de la liste des items à l’aide de $item->{‘description’}.
Le programme écrit à partir des expressions régulières va chercher les lignes correspondantes à l’expression et enregistrer dans les variables $1 et $2 les contenus recherchés (pour ce faire, il récupère la partie qui est entre parenthèses dans notre expression régulière [capture]).
Les fichiers du dossier 2014 sont encodés en utf-8 mais pour d’autres données où ça ne serait pas le cas, la détection de l’encodage est nécessaire. On peut le trouver soit avec la commande file –i, soit avec une expression régulière.

Pour supprimer les doublons, nous vérifions avec un test if que le $titre ou le $description traité n’existe pas déjà dans les tables de hashage respectives. Si ils n’y sont pas, alors on les incrémente :

if (!(exists($dictionnairedesfils{$titre})) and !(exists($dictionnairedescription{$description})))
                {
                $dictionnairedesfils{$titre}++;
                $dictionnairedescription{$description}++;

Enfin l’impression des contenus pour le texte brut est faite en imprimant d’abord le titre, saut à la ligne, la description et § pour délimiter un article. Pour le xml, on ajoute une première balise <item> pour chaque article et des balises <title> ou <description> autour de la variable correspondante.

print OUT1 "<item><title>$titre</title>\n<description>$description</description>\n</item>\n";


script de la BaO1 avec XML::RSS

script de la BaO1 avec regex